#include <stdio.h>
#include <avr/io.h>
#include <avr/iom644.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <string.h>
#include "usart_utils.h"

#define CLOCK 1000000

#define INT_PER_SECOND ((CLOCK/256)/2)

int counter = 0;
int seconds = 0;

void set_date();

int
main(void) {

	int i = 0;
	char aux = 0;
	char buffer[50] = { };
	char string[20] = { };

	/* Se setea el timer. */
	TCCR0A = (0 << WGM00)|(1 << WGM01);
	TCCR0B = (0 << WGM02)|(0 << CS00)|(0 << CS01)|(1 << CS02);

	/* Se setea el valor para comparar. */
	OCR0A = 1;

	/* Mascara de interrupciones. */
	TIMSK0 = (1 << OCIE0A);

	/* Se inicializan los puertos de entrada y salida. */
	DDRD = 0xFF;
	DDRB = 0x00;

	/* Se inicia la controladora de serie. */

	USART_Init(25);

	/* Se habilitan las interrupciones. */
	sei();

	while(1) {

		/* Se lee cada caracter hasta encontrar un espacio. */

		i = 0;

		do {
			aux = USART_Receive();
			buffer[i] = aux;
			USART_Transmit(aux);
			i++;
		} while (aux != ' ' && aux != '\r');

		buffer[i-1] = 0;

		/* Si se encontro un espacio, se sigue procesando el comando. */

		if (strcmp(buffer, "date") == 0) {
			sprintf(string, "System Time: %d\n\r", seconds);
			USART_Send_String(string);
		} else if (strcmp(buffer, "set") == 0) {
			set_date();
		} else if (strcmp(buffer, "reset") == 0) {
			seconds = 0;
		} else {
			USART_Send_String(" Error!\n\r");
		}
	}
}

void
set_date() {

	int i = 0;
	char aux = 0;
	char buffer[10] = { };

	do {
		aux = USART_Receive();
		USART_Transmit(aux);
		buffer[i] = aux;
		i++;
	} while (aux != '\r');

	buffer[i-1] = 0;
	sscanf(buffer, "%d", &seconds);

}

/* Funcion para atender la interrupcion del timer. */

ISR(TIMER0_COMPA_vect) {

	counter ++;
	if(counter == INT_PER_SECOND) {
		seconds++;
		counter = 0;
	}
}
